home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <time.h>
- #include "global.h"
- #include "mbuf.h"
- #include "iface.h"
- #include "trace.h"
- #include "session.h"
- #include "misc.h"
-
- static void ctohex(char *, int16);
-
- /* Redefined here so that programs calling dump in the library won't pull
- * in the rest of the package
- */
- static char nospace[] = "No space!!\n";
-
- void dump(register struct interface *interface, int direction,
- unsigned type, struct mbuf *bp)
- {
- struct mbuf *tbp;
- void (*func)();
- int16 size;
- time_t t;
- struct tm *tm;
-
- if((interface->trace & direction) == 0)
- return; /* Nothing to trace */
-
- time(&t);
- tm = localtime(&t);
-
- switch(direction){
- case IF_TRACE_IN:
- twprintf("%02d:%02d:%02d %s recv:\n",tm->tm_hour,tm->tm_min,tm->tm_sec,interface->name);
- break;
- case IF_TRACE_OUT:
- twprintf("%02d:%02d:%02d %s sent:\n",tm->tm_hour,tm->tm_min,tm->tm_sec,interface->name);
- break;
- }
- if(bp == NULLBUF || (size = len_mbuf(bp)) == 0){
- twprintf("empty packet!!\n");
- twupdate(1);
- return;
- }
-
- if(type < NTRACE)
- func = tracef[type];
- else
- func = NULLVFP;
-
- dup_p(&tbp,bp,0,size);
- if(tbp == NULLBUF){
- twprintf(nospace);
- twupdate(1);
- return;
- }
- if(func != NULLVFP)
- (*func)(&tbp,1);
- if(interface->trace & IF_TRACE_ASCII){
- /* Dump only data portion of packet in ascii */
- ascii_dump(&tbp);
- } else if(interface->trace & IF_TRACE_HEX){
- /* Dump entire packet in hex/ascii */
- free_p(tbp);
- dup_p(&tbp,bp,0,len_mbuf(bp));
- if(tbp != NULLBUF)
- hex_dump(&tbp);
- else
- twprintf(nospace);
- }
- free_p(tbp);
- }
-
- /* Dump an mbuf in hex */
- void hex_dump(register struct mbuf **bpp)
- {
- int16 n;
- int16 address;
- char buf[16];
-
- if(bpp == NULLBUFP || *bpp == NULLBUF)
- return;
-
- address = 0;
- while((n = pullup(bpp,buf,sizeof(buf))) != 0){
- fmtline(address,buf,n);
- address += n;
- }
- }
- /* Dump an mbuf in ascii */
- void ascii_dump(register struct mbuf **bpp)
- {
- char Buffer[10];
- char c;
- register int16 tot;
- char *line;
-
- if(bpp == NULLBUFP || *bpp == NULLBUF)
- return;
-
- line = malloc(2000);
- *line = '\0';
- tot = 0;
-
- while(pullup(bpp,&c,1) == 1){
- if((tot % 64) == 0){
- sprintf(Buffer, "%04x ",tot);
- strcat(line, Buffer);
- }
- if (isprint(c)) {
- sprintf(Buffer, "%c", c);
- strcat(line, Buffer);
- } else {
- strcat(line, ".");
- }
- if((++tot % 64) == 0)
- strcat(line, "\n");
- }
- if((tot % 64) != 0)
- strcat(line, "\n");
-
- twputs(line);
- free(line);
- }
- /* Print a buffer up to 16 bytes long in formatted hex with ascii
- * translation, e.g.,
- * 0000: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 0123456789:;<=>?
- */
- void fmtline(int16 addr, char *buf, int16 len)
- {
- char line[80];
- register char *aptr,*cptr;
- register char c;
-
- memset(line,' ',sizeof(line));
- ctohex(line,hibyte(addr));
- ctohex(line+2,lobyte(addr));
- aptr = &line[6];
- cptr = &line[55];
- while(len-- != 0){
- c = *buf++;
- ctohex(aptr,(int16)uchar(c));
- aptr += 3;
- c &= 0x7f;
- *cptr++ = isprint(c) ? c : '.';
- }
- *cptr++ = '\r';
- *cptr++ = '\n';
- *cptr = '\0';
-
- twputs(line);
- }
- /* Convert byte to two ascii-hex characters */
- static void ctohex(register char *buf, register int16 c)
- {
- static char hex[] = "0123456789abcdef";
-
- *buf++ = hex[hinibble(c)];
- *buf = hex[lonibble(c)];
- }
-
-